home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smb_dom2sid.nasl < prev    next >
Text File  |  2005-01-14  |  13KB  |  510 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10398);
  10.  script_bugtraq_id(959);
  11.  script_version ("$Revision: 1.32 $");
  12.  script_cve_id("CVE-2000-1200");
  13.  
  14.  name["english"] = "SMB get domain SID";
  15.  name["francais"] = "Obtentention du SID du domaine par SMB";
  16.  
  17.  script_name(english:name["english"],
  18.           francais:name["francais"]);
  19.  
  20.  desc["english"] = "
  21.  
  22. This script emulates the call to LsaQueryInformationPolicy()
  23. to obtain the domain (or host) SID (Security Identifier).
  24.  
  25. The domain/host SID can then be used to get the list
  26. of users of the domain or the list of local users
  27.  
  28. Risk factor : Low";
  29.  
  30.  desc["francais"] = "
  31.  
  32. Ce script Θmule la fonction LsaQueryInformationPolicy()
  33. afin d'obtenir le SID du domaine ou de la
  34. machine
  35.  
  36.  
  37. Le SID peut ensuite etre utilisΘ pour rΘcuperer la
  38. liste des utilisateurs du domaine ou les utilisateurs
  39. locaux. 
  40.  
  41. Facteur de risque : faible";
  42.  
  43.  script_description(english:desc["english"],
  44.              francais:desc["francais"]);
  45.  
  46.  summary["english"] = "Gets the domain SID";
  47.  summary["francais"] = "Obtention du SID du domaine";
  48.  script_summary(english:summary["english"],
  49.          francais:summary["francais"]);
  50.  
  51.  script_category(ACT_GATHER_INFO);
  52.  
  53.  script_copyright(english:"This script is Copyright (C) 2000 Renaud Deraison");
  54.  family["english"] = "Windows";
  55.  script_family(english:family["english"]);
  56.  
  57.  script_dependencies("smb_scope.nasl",
  58.               "netbios_name_get.nasl",
  59.               "smb_login.nasl");
  60.  script_require_keys("SMB/transport", "SMB/name", "SMB/login", "SMB/password", "SMB/test_domain");
  61.  script_require_ports(139, 445);
  62.  exit(0);
  63. }
  64.  
  65.  
  66. d = get_kb_item("SMB/test_domain");
  67. if(!d)exit(0);
  68.  
  69. include("smb_nt.inc");
  70.  
  71. port = kb_smb_transport();
  72. if(!port)port = 139;
  73.  
  74.  
  75. #---------------------------------------------------------#
  76. # Set up the pipe request by calling LSA_OPENPOLICY       #
  77. #---------------------------------------------------------#
  78.         
  79. function pipe_request_lsa_open_policy_setup(soc, uid, tid, pipe)
  80. {
  81.  tid_low = tid % 256;
  82.  tid_high = tid / 256;
  83.  uid_low = uid % 256;
  84.  uid_high = uid / 256;
  85.  pipe_low = pipe % 256;
  86.  pipe_high = pipe / 256;
  87.  
  88.  req = raw_string(0x00, 0x00,
  89.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  90.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  91.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  92.           0x00, 0x06, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  93.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  94.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  95.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  96.           0x00, 0x48, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  97.           0x00, pipe_low, pipe_high, 0x51, 0x00, 0x5C, 0x50, 0x49,
  98.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  99.           0x0B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  100.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16,
  101.           0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  102.           0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x57,
  103.           0x34, 0x12, 0x34, 0x12, 0xCD, 0xAB, 0xEF, 0x00,
  104.           0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0x00, 0x00,
  105.           0x00, 0x00, 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C,
  106.           0xc9, 0x11, 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10,
  107.           0x48, 0x60, 0x02, 0x00, 0x00, 0x00);      
  108.  send(socket:soc, data:req);
  109.  r = smb_recv(socket:soc, length:4096);
  110.  if(!r)return(FALSE);
  111.  if(ord(r[9])==0)return(r);
  112.  else return(FALSE);
  113. }
  114.  
  115.  
  116. function lsa_unicode(data)
  117. {
  118.  len = strlen(data);
  119.  ret = raw_string(ord(data[0]));
  120.  
  121.  for(i=1;i<len;i=i+1)
  122.  {
  123.   ret = ret + raw_string(0, ord(data[i]));
  124.  }
  125.  
  126.  
  127.  if(!(len & 1)){even = 1;}
  128.  else even = 0;
  129.  
  130.  
  131.  if(even)
  132.   {
  133.   ret = ret + raw_string(0,0,0,0xC9, 0x11, 0x18);
  134.   }
  135.  else
  136.   ret = ret + raw_string(0,0,0,0x18);
  137.  
  138.  for(i=0;i<19;i=i+1)
  139.   ret = ret + raw_string(0);
  140.   
  141.  return(ret);
  142. }
  143.  
  144.  
  145.  
  146.  
  147. #-----------------------------------------------------------------#
  148. # First step : we do _some_ request and we are returned a magic   #
  149. # number that we will use in step 2                               #
  150. #                                                                 #
  151. # (things are starting to get complicated)                        #
  152. #                                                                 # 
  153. #-----------------------------------------------------------------#
  154.  
  155. function pipe_request_lsa_open_policy_step1(soc, uid, tid, pipe, name)
  156. {
  157.  
  158.  tid_low = tid % 256;
  159.  tid_high = tid / 256;
  160.  
  161.  uid_low = uid % 256;
  162.  uid_high = uid / 256;
  163.  
  164.  pipe_low = pipe % 256;
  165.  pipe_high = pipe / 256;
  166.  
  167.  
  168.  uc= lsa_unicode(data:tolower(name));
  169.  tot_len = 136 + strlen(uc);
  170.  
  171.  data_count = 60 + strlen(uc);
  172.  data_count_low  = data_count % 256;
  173.  data_count_high = data_count / 256;
  174.  
  175.  
  176.  len = strlen(name) + 3;
  177.  
  178.  len_low = len % 256;
  179.  len_high = len / 256;
  180.  
  181.  total_data_count = 60 + strlen(uc); 
  182.  total_data_count_low = total_data_count % 256;
  183.  total_data_count_high = total_data_count / 256;
  184.  tot_len_low = tot_len % 256;
  185.  tot_len_high = tot_len / 256;
  186.  bcc = 69 + strlen(uc);
  187.  bcc_low = bcc % 256;
  188.  bcc_high = bcc / 256;
  189.  
  190.  x =  36 + strlen(uc);
  191.  x_low = x % 256;
  192.  x_high = x / 256;
  193.  
  194.  y= 116 + strlen(uc);
  195.  y_low = y % 256;
  196.  y_high = y / 256;
  197.  
  198.  h = raw_string(0x00, 0x00, 
  199.            tot_len_high, tot_len_low, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  200.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  201.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  202.           0x00, 0x00, tid_low, tid_high,  0x00, 0x28, uid_low, uid_high,
  203.           g_mlo, g_mhi, 0x10, 0x00, total_data_count_high, total_data_count_low, 0x00, 0x00,
  204.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  205.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  206.           total_data_count_high, total_data_count_low, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  207.           0x00, pipe_low, pipe_high, bcc_low, bcc_high, 0x5C, 0x50, 0x49,
  208.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  209.           0x00, 0x03, 0x10, 0x00, 0x00, total_data_count_high, total_data_count_low, 0x00, 
  210.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, x_low, x_high,
  211.           0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, y_low, 0x34,
  212.           0x13, 0x00, len_low, len_high, 0x00, 0x00, 0x00, 0x00,
  213.           0x00, 0x00, len_low, len_high, 0x00, 0x00, 0x5C, 0x00,
  214.           0x5C, 0x00) + uc + raw_string(
  215.           0x64, 0xFB, 0x12, 0x00, 0x0C, 0x00,
  216.           0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
  217.           0x00, 0x02);
  218.           
  219.  send(socket:soc, data:h);
  220.  r = smb_recv(socket:soc, length:4096);
  221.  if(!r)return(FALSE);
  222.  if(ord(r[9])==0)return(r);
  223.  else return(FALSE);
  224. }
  225.  
  226.  
  227. #-------------------------------------------------------------#
  228. # Utility : convert a 4 bytes value to a long               #
  229. #-------------------------------------------------------------#            
  230. function long(s, index)
  231. {
  232.  if(index+3 >= strlen(s))return(0);
  233.  num = ord(s[index+3]);
  234.  a = num*256;
  235.  num = ord(s[index+2]);
  236.  num = num + a;
  237.  a = num*256;
  238.  num = ord(s[index+1]);
  239.  num = num+a;
  240.  a = num*256;
  241.  num = ord(s[index]);
  242.  num = num+a;
  243.  return(num);
  244. }
  245.  
  246.  
  247. #----------------------------------------------------------#
  248. # Utility : decodes the result of the function step2()     #
  249. #----------------------------------------------------------#
  250. function decode_sid_hex(s)
  251. {
  252.  local_var sid;
  253.  
  254.  
  255.  data_offset = ord(s[52]) * 256;
  256.  data_offset = data_offset + ord(s[51]);
  257.  
  258.  
  259.  pad = 46;    #ord(s[59]);
  260.  
  261.  index = data_offset + 4 + pad + 6;
  262.  
  263.  
  264.  name_len = ord(s[index+1]);
  265.  name_len = name_len * 256;
  266. # display("name_len : ", name_len, "\n");
  267.  
  268.  if(index > strlen(s)) return NULL;
  269.  
  270.  name_len = name_len + ord(s[index]);
  271.  odd = name_len & 1;
  272.  
  273.  name_len = name_len * 2;
  274.  name_len = name_len + 4;
  275.  name = "";
  276.  
  277.  if(strlen(s) < index + name_len + 11)return NULL;
  278.  
  279.  for(i=4;i<name_len;i=i+2)
  280.  {
  281.   name = name + raw_string(ord(s[index+i]));
  282.  }
  283.  index = index + i + 11;
  284.  if(odd)index = index + 2;
  285.  
  286.  sid = NULL;
  287.  sid = raw_string(0, ord(s[index]));
  288.  index = index + 1;
  289.  for(i=0;i<16;i++)sid += s[i+index];
  290.  return(sid);
  291. }
  292.  
  293.  
  294. function decode_sid(s)
  295. {
  296.  data_offset = ord(s[52]) * 256;
  297.  data_offset = data_offset + ord(s[51]);
  298.  
  299.  
  300.  
  301.  pad = 46;    #ord(s[59]);
  302.  
  303.  index = data_offset + 4 + pad + 6;
  304.  if(index + 2 > strlen(s))return(NULL);
  305.  
  306.  name_len = ord(s[index+1]);
  307.  
  308.  name_len = name_len * 256;
  309. # display("name_len : ", name_len, "\n");
  310.  name_len = name_len + ord(s[index]);
  311.  
  312.  
  313.  
  314.  
  315.  odd = name_len & 1;
  316.  
  317.  name_len = name_len * 2;
  318.  name_len = name_len + 4;
  319.  name = "";
  320.  
  321.  if(strlen(s) < name_len +  index ) return NULL;
  322.  
  323.  for(i=4;i<name_len;i=i+2)
  324.  {
  325.   name = name + raw_string(ord(s[index+i]));
  326.  }
  327.  
  328.  
  329.   
  330.   
  331.  index = index + i + 11;
  332.  if(odd)index = index + 2;
  333.  
  334.  
  335.  sid = "";
  336.  
  337.  if(index > strlen(s))return NULL;
  338.  sid = string(ord(s[index]), "-");
  339.  index = index + 1;
  340.  
  341.   
  342.  
  343.  num = long(s:s, index:index);
  344.  sid = string(sid, num, "-");
  345.  index = index+4;
  346.  num = long(s:s, index:index);
  347.  sid = string(sid, num, "-");
  348.  index = index+4;
  349.  num = long(s:s, index:index);
  350.  sid = string(sid, num, "-");
  351.  index = index+4;
  352.  num = long(s:s, index:index);
  353.  sid = string(sid, num);
  354.  
  355.  sid = string(name, " : ", sid); 
  356.  return(sid);
  357.  
  358. }            
  359.  
  360.  
  361. #-----------------------------------------------------------------------#
  362. # This function requests the sid                                        #
  363. #-----------------------------------------------------------------------#
  364.  
  365. function pipe_request_lsa_open_policy_step2(soc, uid, tid, pipe, name, reply)                
  366. {
  367.  
  368.  
  369.  tid_low = tid % 256;
  370.  tid_high = tid / 256;
  371.  
  372.  uid_low = uid % 256;
  373.  uid_high = uid / 256;
  374.  
  375.  pipe_low = pipe % 256;
  376.  pipe_high = pipe / 256;
  377.  
  378.  
  379.  
  380.   req = raw_string(0x00, 0x00,
  381.             0x00, 0x7A, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  382.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0xC2, 0x80,
  383.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  384.           0x00, 0x00, tid_low, tid_high, 0x00, 0x00, uid_low, uid_high,
  385.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x00,
  386.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  387.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  388.           0x00, 0x2E, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  389.           0x00, pipe_low, pipe_high, 0x37, 0x00, 0x5C, 0x50, 0x49,
  390.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  391.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x00,
  392.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00,
  393.           0x00, 0x00, 0x00, 0x00, 0x07, 0x00);
  394.     
  395.   magic = raw_string(ord(reply[84]));          
  396.   for(i=1;i<20;i=i+1)
  397.   {
  398.    magic = magic + raw_string(ord(reply[84+i]));
  399.   }
  400.   
  401.   req = req + magic + raw_string(0x03, 0x00);
  402.  
  403.   send(socket:soc, data:req);
  404.   r = smb_recv(socket:soc, length:4000);
  405.   return(r);  
  406. }
  407.  
  408.      
  409.          
  410. #---------------------------------------------------------------------#
  411. # Here is our main()                                                  #
  412. #---------------------------------------------------------------------#
  413.  
  414.  
  415. name = kb_smb_name();
  416. if(!name)exit(0);
  417.  
  418.  
  419. if(!get_port_state(port))exit(0);
  420.  
  421. login = kb_smb_login();
  422. pass  = kb_smb_password();
  423.  
  424. if(!login)login = "";
  425. if(!pass) pass = "";
  426.  
  427. dom = kb_smb_domain();
  428.       
  429. soc = open_sock_tcp(port);
  430. if(!soc)exit(0);
  431. #
  432. # Request the session
  433. r = smb_session_request(soc:soc,  remote:name);
  434. if(!r)exit(0);
  435.  
  436. #
  437. # Negociate the protocol
  438. #
  439. prot = smb_neg_prot(soc:soc);
  440. if(!prot)exit(0);
  441.  
  442. #
  443. # Set up our session
  444. #
  445. r = smb_session_setup(soc:soc, login:login, password:pass, domain:dom, prot:prot);
  446. if(!r)exit(0);
  447. # and extract our uid
  448. uid = session_extract_uid(reply:r);
  449.  
  450. #
  451. # Connect to the remote IPC and extract the TID
  452. # we are attributed
  453. #      
  454. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  455. # and extract our tree id
  456. tid = tconx_extract_tid(reply:r);
  457.  
  458.  
  459. #
  460. # Create a pipe to lsarpc
  461. #
  462. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\lsarpc");
  463. if(!r)exit(0);
  464. # and extract its ID
  465. pipe = smbntcreatex_extract_pipe(reply:r);
  466.  
  467. #
  468. # Setup things
  469. #
  470. r = pipe_request_lsa_open_policy_setup(soc:soc, uid:uid, tid:tid, pipe:pipe);
  471. if(!r)exit(0);
  472.  
  473. #
  474. # Get the magic number
  475. #
  476. r = pipe_request_lsa_open_policy_step1(soc:soc, uid:uid, tid:tid, pipe:pipe,name:name);
  477. if(!r)exit(0);
  478.  
  479. #
  480. # Get the SID
  481. #
  482. r = pipe_request_lsa_open_policy_step2(soc:soc, uid:uid, tid:tid,
  483.                    pipe:pipe,name:name, reply:r);
  484.  
  485. if(!r)exit(0);
  486. close(soc);
  487.  
  488.  
  489. #
  490. # Woowoo
  491. #
  492. domain_sid = decode_sid(s:r);
  493. domain_sid_hex = decode_sid_hex(s:r);
  494.  
  495. if( "0-0-0-0-0" >< domain_sid ) exit(0);
  496.  
  497.  
  498. if(strlen(domain_sid_hex) != 0)
  499. {
  500. set_kb_item(name:"SMB/domain_sid", value:domain_sid);
  501. set_kb_item(name:"SMB/domain_sid_hex", value:hexstr(domain_sid_hex));
  502. str = string("The domain SID can be obtained remotely. Its value is :\n\n",
  503.                domain_sid, "\n\n",
  504.               "An attacker can use it to obtain the list of the local users of this host\n",
  505.           "Solution : filter the ports 137 to 139 and 445\n",
  506.           "Risk factor : Low\n");
  507. security_warning(data:str, port:port);
  508. }
  509.